package testDominio;

import java.util.ArrayList;
import java.util.Iterator;


import com.lanchita.excepciones.EstadoErroneoException;

import dominio.*;
import gestionDeFechas.*;

import excepciones.AsientoYaSobreReservadoPorElUsuarioException;

public class MockGestionadorLanchita extends Gestionador{
	private static MockAerolineaLanchita aerolineaLanchita = new MockAerolineaLanchita();
	// Esto es para cuando usan los test
	
	private ArrayList<ListaSobreReserva> sobreReservasLanchita = new ArrayList<ListaSobreReserva>();
	private double porcentaje;

	// TODO checkear que todo este bien

	public MockGestionadorLanchita() {
		porcentaje = 0.15;
	}

	public Asiento parsearAsiento(Object asientoParaParsear) {
		String[] asientoAParsear = (String[]) asientoParaParsear;
		Asiento asiento = new Asiento();
		String[] codigoDeVueloAsiento = asientoAParsear[0].split("-");
		// Esto separa el numero de vuelo con el numero de asiento

		// Empiezo a rellenar el objeto creado
		asiento.setCodigoDeVuelo(codigoDeVueloAsiento[0]);
		asiento.setCodigoDeAsiento(codigoDeVueloAsiento[1]);
		asiento.setPrecio(asientoAParsear[1]);
		asiento.setClase(asientoAParsear[2]);
		asiento.setUbicacion(asientoAParsear[3]);
		asiento.setReservado(asientoAParsear[4] != "D");
		asiento.setDNIDelQueLoReservo(asientoAParsear[5]);
		asiento.setHoraDeSalida(asientoAParsear[6]);
		asiento.setHoraDeLlegada(asientoAParsear[7]);
		asiento.setOrigen(asientoAParsear[8]);
		asiento.setDestino(asientoAParsear[9]);
		asiento.setFechaDeSalida(asientoAParsear[10]);
		asiento.setFechaDeLlegada(asientoAParsear[11]);

		return asiento;
	}

	public ArrayList<Asiento> buscarAsientosSinFecha(String origen,
			String destino) {
		ArrayList<Asiento> asientosADevolver = new ArrayList<Asiento>();

		String[][] asientos = aerolineaLanchita.asientosDisponibles(origen,
				destino, null, null, null, null);

		// Con este primer for queremos meter en asientosADevolver cada asiento
		for (int j = 0; j < asientos.length; j++) {
			Asiento asiento = this.parsearAsiento(asientos[j]);
			asiento.setAerolinea(Aerolinea.aerolineaLANCHITA);
			asientosADevolver.add(asiento);
		}

		return asientosADevolver;
	}

	public ArrayList<Asiento> BuscarAsientosQueTengan(String origen,
			String destino, String fecha) {

		String[][] asientos;
		ArrayList<Asiento> asientosADevolver = new ArrayList<Asiento>();
		Parser flexible = new ParseadorFlexible();
		Fecha fechaDeBusqueda = new Fecha(flexible, fecha);

		asientos = aerolineaLanchita.asientosDisponibles(origen, destino, null,
				null, null, null);

		// Con este primer for queremos meter en asientosADevolver cada asiento
		for (int j = 0; j < asientos.length; j++) {

			Asiento asiento = this.parsearAsiento(asientos[j]);
			Fecha fechaSalidaFormateada = new Fecha(flexible,
					asiento.getFechaDeSalida());
			Fecha fechaLlegadaFormateada = new Fecha(flexible,
					asiento.getFechaDeLlegada());

			// Ahora que ya sabemos qué campos tiene el asiento, lo metemos en
			// la lista de asientos que vamos a devolver.
			if (fechaSalidaFormateada.esAnteriorOIgualA(fechaDeBusqueda)
					&& fechaDeBusqueda
							.esAnteriorOIgualA(fechaLlegadaFormateada))
				asientosADevolver.add(asiento);

		}

		return asientosADevolver;
	}

	public void comprarAsiento(Asiento asiento, String dni) {
		try {
			String codigoDeVueloAsiento = asiento.getCodigoDeVuelo() + "-"
					+ asiento.getCodigoDeAsiento();
			aerolineaLanchita.comprar(codigoDeVueloAsiento);
		} catch (AsientoLanchitaNoDisponibleException e) {
			throw new BusinessException(
					"La aerolínea informa que el asiento ya está ocupado");
		}
	}

	public double impuestos(Asiento asiento) {
		double impuestos = Double.parseDouble(asiento.getPrecio());
		impuestos = impuestos * this.porcentaje;
		return impuestos;
	}

	public void reservarAsiento(String dni, Asiento asiento) {
		
		// variables -----------------------------------------------------------------------
		
		// se genera el codigo del asiento sumando el codigo de vuelo y el codigo de asiento
		String codigoDeAsiento = asiento.getCodigoDeVuelo() + "-" + asiento.getCodigoDeAsiento();
		ListaSobreReserva listaSobreReserva = null;
		boolean estaRepetido = false;
		
		// codigo --------------------------------------------------------------------------
		
		// al tratar de reservar el asiento, aerolinea lanchita no devuelve nada
		// si se reserva correctamente, pero si no se puede reservar, va a lanzar
		// una excepcion EstadoErroneoException
		try {
			aerolineaLanchita.reservar(codigoDeAsiento, dni);
		} catch (EstadoErroneoException mensaje) {
			// como no se pudo reservar debido que el asiento ya lo esta
			// sobrereservo el asiento
			
			// busca la lista correspondiente al asiento
			listaSobreReserva = this.buscarEnSobreReservasLanchita(asiento);
			
			if (listaSobreReserva == null) {
				
				// si buscarEnSobreReservasLanchita devuelve un null se crea una nueva instancia de
				// listaSobreReserva
				listaSobreReserva = new ListaSobreReserva(asiento);
				sobreReservasLanchita.add(listaSobreReserva);
				
			}
			else {
				
				// si devuelve algo diferente de null, se checkea que el DNI no este repetido dentro del arraylist
				estaRepetido = listaSobreReserva.dNIEstaRepetido(dni);
				
				if (estaRepetido) {
					// si esta repetido el DNI se lanza AsientoYaSobreReservadoException
					throw new AsientoYaSobreReservadoPorElUsuarioException();
					
				}
			
		}

	}

}

	private ListaSobreReserva buscarEnSobreReservasLanchita(Asiento asiento) {
		// busca dentro del arraylist de LANCHITA un objeto del tipo ListaSobreReserva en el cual el asiento 
		// coincida con el que se ingresa, si no lo encuentra devuelve un null
		
		// variables ------------------------------------------------------------------------------
		ListaSobreReserva asientoSobreReservadoAComparar = null;
		Asiento asientoAComparar = null;
		
		// codigo ---------------------------------------------------------------------------------
		for (Iterator<ListaSobreReserva> iterator = sobreReservasLanchita.iterator(); iterator.hasNext();) {
			asientoSobreReservadoAComparar = (ListaSobreReserva) iterator.next();
			asientoAComparar = asientoSobreReservadoAComparar.getAsiento();
			if (asientoAComparar.equals(asiento)) {
				
				// retorna el asiento con el arraylist de DNIs
				return asientoSobreReservadoAComparar;
			}
			
		}
		
		// como no retorno en el return anterior, retorna un null
		return null;
	}

	@Override
	public ArrayList<Asiento> buscarAsientosQueTengan(String origen,
			String destino, String fecha) {
		// TODO Auto-generated method stub
		return null;
	}
}
